package ufr_stgi.assistance_conduite.ecouteur;

import ufr_stgi.assistance_conduite.MonApplication;
import ufr_stgi.assistance_conduite.R;
import ufr_stgi.assistance_conduite.synchronisation.Synchronisation;
import android.location.*;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

/**
 * Listener qui met à jour dans l'application la position du Smartphone
 * @author Guillaume MONTAVON & Renaud DAVID (Master 2 RIM)
 */
public class GPSListener implements LocationListener {
	
	private MonApplication appli;
	
	public GPSListener(MonApplication appli) {
		this.appli = appli;
	}
	
	@Override
	public void onLocationChanged(Location location) {

		if(location != null) {
			Log.i("onLocationChanged", "onLocationChanged");
			
			double ancienLatitude = appli.getLatitude();
			double ancienLongitude = appli.getLongitude();
			
			appli.setLatitude(location.getLatitude());
			appli.setLongitude(location.getLongitude());
			appli.setDirection(calculerDirection(location));
			appli.setVitesse(location.getSpeed());
			
			appli.getMain().MAJPosition();
			//activer le bouton pour prendre photo
			if(appli.getRp() != null) {
				appli.getRp().MAJVitesse();
				
				if(ancienLatitude == 0.0 && ancienLongitude == 0.0)
					appli.getRp().activerBouton();
			}
			
			//MAJ des panneaux si on se trouve dans une nouvelle zone dont on ne connaît pas les panneaux
			if(((int)(ancienLatitude / MonApplication.TAILLE_ZONE_POSITION) != (int)(location.getLatitude() / MonApplication.TAILLE_ZONE_POSITION)) || ((int)(ancienLongitude / MonApplication.TAILLE_ZONE_POSITION) != (int)(location.getLongitude() / MonApplication.TAILLE_ZONE_POSITION))) {
				
				Log.i("Changement de zone", "Changement de zone");
				
				Synchronisation maj_panneaux = new Synchronisation(appli, Synchronisation.ACTION_MAJ_PANNEAU);
				maj_panneaux.start();
				
				Synchronisation images_panneaux = new Synchronisation(appli, Synchronisation.ACTION_MAJ_IMAGES_PANNEAU);
				images_panneaux.start();
				
				//TODO pb : doit etre très rapide
				
				try {
					maj_panneaux.join();
					images_panneaux.join();
				} catch (InterruptedException e) {
					Log.e("Erreur", e.getMessage());
				}
				if(appli.getRp() != null)
					appli.getRp().MAJAlerteProximite();
				
			}
		}
		
	}
	
	@Override
	public void onProviderDisabled(String provider) {
		Toast.makeText(appli, R.string.gps_desactive, 2000).show();
		appli.createGpsDisabledAlert();
		Log.i("GPS","GPS disabled");
	}
	
	@Override
	public void onProviderEnabled(String provider) {
		Toast.makeText(appli, R.string.gps_active, 2000).show();
		Log.i("GPS","GPS enabled");
	}
	
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
		switch (status) {
			case LocationProvider.OUT_OF_SERVICE:
				Log.i("GPS","GPS out of service");
				break;
			case LocationProvider.TEMPORARILY_UNAVAILABLE:
				Log.i("GPS","GPS temorarily unavailable");
				break;
			case LocationProvider.AVAILABLE:
				Log.i("GPS","GPS avalible");
				break;
			default:
				Log.i("GPS","EEE");
		}
   }

	/**
	 * Calcul la distance entre l'utilisateur une position donnée en paramètre
	 * @param location position d'un panneau
	 * @return distance entre les 2
	 */
	public int calculerDirection(Location location) {
		
		if(!location.hasBearing() || !location.hasSpeed() || location.getSpeed() == 0.0) //immobile
			return 0;
		else if(location.getBearing() > 315 || location.getBearing() <= 45) //nord
			return 1;
		else if(location.getBearing() <= 135) //est
			return 2;
		else if(location.getBearing() <= 225) //sud
			return 3;
		else //ouest
			return 4;
		
	}
	
}
